package com.yd.basemodule.base

import com.yd.basemodule.error.ResponseThrowable

/**
 * <pre>
 *     author : yh
 *     e-mail : xxx@xx
 *     time   : 2023/12/22
 *     desc   :
 * </pre>
 */
abstract class BaseModel {


    /**
     * @param remote 网络数据
     * @param local 本地数据
     * @param save 当网络请求成功后,保存数据
     * @param isUseCache 是否使用缓存
     */
    suspend fun <T> cacheNetCall(
        remote:suspend () -> IBaseResponse<T>,
        local: suspend () ->T?,
        save:suspend (T)->Unit,
        isUserCache:(T?)->Boolean={true}
    ):T{
        val localData=local.invoke()
        return if (isUserCache(localData)&&localData!=null) localData
        else{
            remote().let { net->
                if (net.isSuccess()) net.data().also { save(it) }
                throw ResponseThrowable(net)
            }
        }

    }

    fun onCleared(){

    }
}